Assessing Demographic and Case-Level Predictors of Exoneration Duration Using LME and GEE Models

Author

Obehi Winnifred Ikpea

Published

June 3, 2025

1 Introduction

In all criminal prosecutions, the accused shall enjoy the right to a speedy and public trial by an impartial jury of the state and district wherein the crime shall have been committed, which district shall have been previously ascertained by law, and to be informed of the nature and cause of the accusation; to be confronted with the witnesses against him; to have compulsory process for obtaining witnesses in his favor, and to have the Assistance of Counsel for his defense (Constitution Annotated, n.d.). The Sixth Amendment provides critical protections for those accused of crimes. Yet, despite these safeguards, wrongful convictions persist, and the journey from false imprisonment to exoneration differs significantly, contradicting the amendment’s promise of prompt justice.

Former U.S. Senator Ted Stevens is a notable case of wrongful conviction. He was prosecuted and found guilty of alleged criminal ethics violations. His conviction was ultimately overturned when a whistleblower revealed that prosecutors had withheld crucial evidence that could have proved his innocence, thereby violating his constitutional rights. Although the time between his conviction and exoneration was less than a year, the damage was already done, costing him his bid for reelection and leaving a lasting negative stigma associated with the allegations (National Association of Criminal Defense Lawyers, 2022).

Similarly, LaCresha Murray’s story highlights the tragic consequences of wrongful convictions. Convicted in 1996 at just 11 years old, she became the youngest person ever to be convicted of murder in Travis County. She was sentenced to 20 years in a youth prison; however, her conviction was overturned in 1999 after a judge found that her confession had been obtained unlawfully by the police (Aldis, 2023).

Archie Williams’ case underscored significant injustices within the criminal justice system. Wrongfully convicted of rape at the age of 22 due to misidentification, he endured 37 years of incarceration. His long battle for justice, supported by the Innocence Project, culminated in a pivotal moment when a fingerprint found at the crime scene was linked to a serial rapist. This crucial evidence exonerated him, ultimately clearing him of all charges (Lahera, 2023).

The stories of exonerated individuals reveal a significant issue within the American legal system. Since 1989, over 3,000 people have been exonerated in the United States, having collectively spent more than 26,700 years in prison for crimes they did not commit. The reasons for these wrongful convictions are varied and include false confessions, misidentification by eyewitnesses, coerced testimony from informants, misapplication of scientific evidence, government misconduct, and inadequate legal representation.

Significant disparities also exist in the manner in which these wrongful convictions occur. For example, According to the National Registry of Exonerations, more than half of the 3,300 individuals exonerated between 1989 and 2022 are Black, despite Black people making up just 13.6% of the U.S. population. A 2022 report from the registry found that innocent Black individuals were seven times more likely to be wrongfully convicted of murder than innocent white individuals. This racial disproportionality in wrongful conviction cases highlights persistent biases within the criminal legal system (Innocence Project, 2023).

There is a limited understanding of how the timeline from conviction to exoneration varies among wrongfully convicted individuals in the U.S. since 1989, despite over 3,000 exonerations. This research project aims to investigate the impact of demographic factors (age, sex, and race) and crime characteristics (crime type and whether the case is state or federal) on exoneration timelines. We will also analyze trends at both the population and state levels, considering the clustered nature of cases and the longitudinal structure of the data. Understanding these patterns is essential for identifying systemic justice barriers and informing reforms to expedite the pursuit of justice.

2 Methods

2.1 Data and Methods

2.1.1 Data Source

Data for this study were obtained from the National Registry of Exonerations, a comprehensive repository that documents the exoneration of innocent criminal defendants and works to prevent future wrongful convictions. The original dataset contained information on 3,497 individuals, including demographic characteristics (name, age, and sex), geographic information, case details (crime type and sentence), and temporal data (conviction and exoneration dates) (National Registry of Exonerations, 2022).

2.1.2 Data Preparation and Variable Construction

The data preparation process involved several systematic steps to ensure analytical suitability:

2.1.2.1 Variable Selection

Key variables were selected for analysis, including age, sex, race, crime type, state, date of conviction, and date of exoneration.

2.1.2.2 Crime Type Recategorization

Original crime classifications were consolidated into six broader categories based on their legal nature and societal impact:

  • Crimes Against Persons: Offenses causing harm or threat to individuals, including murder, assault, sexual offenses, and kidnapping
  • Property Crimes: Offenses involving theft or property damage, such as burglary, arson, and possession of stolen goods
  • Crimes Against Society: Offenses threatening societal order, including drug violations, weapons offenses, and immigration infractions
  • White-Collar Crimes: Financial and non-violent offenses, encompassing fraud, bribery, tax evasion, and forgery
  • Justice System Crimes: Offenses obstructing legal processes, such as perjury and official misconduct
  • Other Crimes: Miscellaneous offenses not fitting the aforementioned categories
2.1.2.3 Jurisdiction Classification

Cases were classified into two jurisdictional categories: state and federal to facilitate analysis of legal framework differences and their potential impact on case outcomes and procedural variations.

2.1.2.4 Time-to-Exoneration Variable

A continuous variable measuring the duration (in years) from initial conviction to exoneration was calculated for each case.

2.1.2.5 Age Categorization

Preliminary exploratory analysis revealed a positively skewed age distribution, with the majority of individuals aged 20 years or older at the time of conviction. Consequently, age was categorized into discrete groups spanning from adolescence to older adulthood to better capture developmental and life-stage effects on exoneration duration.

Final Dataset

After data cleaning and variable construction, the analytical dataset comprised 3,450 cases in 11 variables. The reduction from 3,497 to 3,450 cases (1.3% attrition) resulted from the exclusion of records with missing or incomplete data essential for the primary analyses.

2.2 Exploratory Data Analysis

Exploratory data analysis is essential in any data-driven or statistical investigation, as it provides a comprehensive understanding of the distribution of each variable within a dataset. This process reveals patterns and trends, highlights associations, and uncovers unusual observations or anomalies.

Using the finalized dataset, we examined the information in both cross-sectional and longitudinal formats.

2.2.0.1 Cross-Sectional Exploratory Analysis

The cross-sectional exploratory analysis included several types of visualizations to examine the distribution and relationships among key variables:

Univariate

  • Histograms illustrating the age distribution of exonerees and the time taken for exoneration:

  • Bar plots depicting the distribution of race, sex, age group, jurisdiction, and crime type among exonerees.

  • Line graphs showing trends in the number of convictions and exonerations over the specified years.

  • A summary table providing numerical summaries of the various characteristics.

Bivariate

  • Stratified line graphs illustrating the time to exoneration across various demographic and crime characteristics.

  • Stratified bar charts displaying the distribution of crime types by age group, race, and sex.

  • Stratified violin plots representing the distribution of years until exoneration, segmented by age group, sex, race, and crime type.

  • Two heatmaps illustrating the number of exonerations in each state, as well as the average time to exoneration for those states.

These visualizations and tables reveal patterns associated with age, race, sex, crime type, and jurisdiction, offering valuable insights into the groups most affected by wrongful convictions.

2.2.0.2 Longitudinal Exploratory Analysis

To examine the longitudinal structure of the data, we developed several specialized visualizations:

  • Mean trajectory plots were constructed to visualize the average time to exoneration following an initial conviction since 1989. An overall mean trajectory plot, along with stratified plots, was created to examine the influence of various case and demographic characteristics on this pattern.

  • Spaghetti plots were employed to visually compare the trends in time to exoneration across different states in the United States since 1989. Furthermore, stratified plots were developed to explore how unique case-specific and demographic factors impact these trajectories.

  • State-specific trajectory plots were generated faceted by state for all 50 states and the District of Columbia. These plots highlight the within-state variability in the duration from initial conviction to exoneration, providing an in-depth analysis of the temporal aspects of the exoneration process across various jurisdictions.

These visualizations uncovered significant patterns in exoneration timelines, effectively addressing the clustered nature of the data and enriching our understanding of wrongful conviction trends within the United States justice system.

2.3 Statistical Analyses

To address the research objectives, we employed two approaches suitable for analyzing longitudinal and clustered data: the Linear Mixed Effects Model (LME) and the Generalized Estimating Equations (GEE) framework. These methods allowed us to assess both subject-specific and population-averaged effects, respectively (Fitzmaurice et al., 2011; Vanegas et al., 2023).

2.3.0.1 Linear Mixed Effects Model

The linear mixed effects model (LME) assumes that exoneration timelines depend on a combination of fixed effects (population-level parameters shared by all states) and state-specific random effects. This leads to a model for the marginal mean response averaged over the distribution of the random effects. The introduction of random effects induces covariance among exoneration cases within the same state (Fitzmaurice et al., 2011). Three common formulations of the linear mixed effects models were considered:

  • Random Intercept Only: In this model, each state is assumed to have a unique underlying baseline level of response that persists over time. It estimates a unique intercept for each state in addition to overall population-level parameters.

\[ \begin{aligned} Y_{ij} &= (\beta_0 + U_{0i}) + \beta_1\,X_{ij} + \beta_2\,T_{ij} + \beta_3\,(X_{ij}\times T_{ij}) + \varepsilon_{ij} \end{aligned} \]

This model describes the mean response trajectory over time for any state. \(U_{0i}\) is the state-specific random intercept that describes how the baseline level for the \(i^{th}\) state deviates from the population average (\(\beta_0\)), after the effects of the covariates have been accounted for.

  • Random Intercept + Random Slope on (T) (Uncorrelated): This model estimates both a common intercept and slope, as well as state-specific intercepts and slopes, but assumes that the random intercept and slope are uncorrelated:

\[ \begin{aligned} Y_{ij} &= (\beta_0 + U_{0i}) + \beta_1\,X_{ij} + (\beta_2 + U_{1i})\,T_{ij} + \beta_3\,(X_{ij}\times T_{ij}) + \varepsilon_{ij}\\ \end{aligned} \]

  • Random Intercept + Random Slope on (T) (Correlated): This formulation is the same as Model 2 but allows the random intercept and slope to be correlated:

\[ \begin{aligned} Y_{ij} &= (\beta_0 + U_{0i}) + \beta_1\,X_{ij} + (\beta_2 + U_{1i})\,T_{ij} + \beta_3\,(X_{ij}\times T_{ij}) + \varepsilon_{ij},\\ \end{aligned} \]

All three models were fitted to address each research objective and subsequently compared using the Akaike Information Criterion (AIC), Bayesian Information Criterion (BIC), and the likelihood ratio test. The Random Intercept + Random Slope (Uncorrelated) model consistently exhibited the best fit, reflected by the lowest AIC and BIC values, and was thus selected as the final model. To evaluate the significance of the main effects and interactions, Type III Wald chi-square tests were conducted using the car::Anova() function.

2.3.0.2 Generalized Estimating Equations

The Generalized Estimating Equations (GEE) method is a statistical technique for analyzing clustered or correlated data. Unlike mixed effects models, GEE focuses on estimating population-averaged effects rather than subject-specific impacts for individual clusters (Vanegas et al., 2023).

In our analysis, we initially employed an exchangeable working correlation structure, which assumes that all pairs of observations within each state have equal correlation, regardless of their temporal separation. We also explored alternative working correlation structures, including independence and autoregressive structures. Using model selection criteria. Specifically the Quasi-likelihood under Independence Criterion (QIC) and Correlation Information Criterion (CIC), we identified the structure with the lowest fit statistic. In this case, the exchangeable correlation structure provided the best fit to our data.

2.3.0.3 Model Specification

Each model included the following general marginal structure:

\[E[Y_{ij}|X_{ij}, T_{j}] = \beta_0 + \beta_1T_{j} + \beta_2X_{ij} + \beta_3T_{j}X_{ij}\]

Where:

  • \(Y_{ij}\): Time to exoneration for state \(i\) in year \(j\)
  • \(T_{j}\): Years since 1989 (baseline year)
  • \(X_{ij}\): Covariate of interest for state \(i\) in year \(j\) (e.g., proportion of cases by sex, race, crime type, age group, or jurisdiction type)
  • \(i\): Index for state (cluster), \(i = 1, 2, ..., 51\) (50 states + DC)
  • \(j\): Index for year within each state cluster, \(j = 1989, 1990, ..., 2024\)

Separate models were fit for each covariate. Wald tests were used to assess:

  • \(\beta_1\): The main effect of time (overall temporal trends in time to exoneration)
  • \(\beta_2\): The main effect of the covariate (differences in time to exoneration by covariate level)
  • \(\beta_3\): The interaction between time and the covariate (whether temporal trends differ by covariate level)

3 Results

This section presents findings from exploratory data analysis and statistical assessments, showcasing them through various forms such as graphical representations, tables, and statistical models.

3.1 Exploratory Data Analysis:

3.1.1 Cross-sectional Structure

The quarto dashboard provided a comprehensive cross-sectional overview of the variables in the exoneration dataset. The visualizations were organized into three categories: Univariate distributions, Bivariate distributions and associations, and Trend visualizations. This structure allowed for effective analysis of the data. Notable observations include:

  • The average time from initial conviction to exoneration was 12.3 years with the histogram being positively skewed.
  • The average age of the convicted then exonerated individuals was 28.3 years with a positively skewed distribution.
  • Males comprised the majority of exoneration cases (over 90%), with particularly high representation in person crimes (93%) and justice system crimes (94%).
  • The 20-29 year old age group comprised the majority of exoneration cases (over 40%), with early adulthood (20-29) representing 45% of person crimes exonerations, and 46% of society crimes.
  • Black individuals were disproportionately represented in exoneration cases, accounting for 53% of the total, with particularly high representation in society crimes (69%) and person crimes (52%).
  • State cases comprised the majority of exonerations compared to federal cases, with nearly all person crimes exonerations (99%) occurring at the state level.
  • Crimes against persons accounted for over 72% of exoneration cases, with 2,508 cases representing the largest category by far.
  • Time to exoneration varied significantly by crime type, with person crimes taking the longest (14.34 years on average) and justice system crimes the shortest (4.10 years).
  • White-collar crimes showed the highest proportion of white defendants (75%) and federal jurisdiction cases (69%). (Ikpea, 2024)

3.1.2 Longitudinal Structure

  1. Plot of Means:
Code
summary_crime_type <- longitudinal_data_clean |>
  group_by(crime_type, years_since_1989) |>
  summarize(mean_duration = mean(time_to_exoneration), .groups = "drop")

highlight_crime <- summary_crime_type |>
  group_by(crime_type) |>
  filter(mean_duration == min(mean_duration) | mean_duration == max(mean_duration)) |>
  mutate(
    label = paste0("Year: ", years_since_1989, "\nMean: ", round(mean_duration, 2))
  )

ggplot(summary_crime_type, aes(x = years_since_1989, y = mean_duration, group = crime_type, color = crime_type)) +
  geom_line(linewidth = 1) +
  geom_point(aes(shape = crime_type), size = 2) +
  geom_label(
    data = highlight_crime,
    aes(label = label, fill = crime_type),  # <-- Changed from type to sex
    nudge_y = 0.5,
    color = "white",
    label.padding = unit(0.2, "lines"),
    label.size = 0.3,
    size = 3,
    show.legend = FALSE
  )+
  labs(
    title = "Mean Time from Conviction to Exoneration by Crime Type",
    x = "Years Since 1989", 
    y = "Time from Conviction to Exoneration (Years)"
  ) +
  theme_minimal(base_size = 11) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
        legend.position = "bottom") +
  scale_color_brewer(palette = "Paired")
summary_race <- longitudinal_data_clean |>
  group_by(race, years_since_1989) |>
  summarize(mean_duration = mean(time_to_exoneration), .groups = "drop")

highlight_race <- summary_race |>
  group_by(race) |>
  filter(mean_duration == min(mean_duration) | mean_duration == max(mean_duration)) |>
  mutate(
    label = paste0("Year: ", years_since_1989, "\nMean: ", round(mean_duration, 2))
  ) 
ggplot(summary_race, aes(x = years_since_1989, y = mean_duration, group = race, color = race)) +
  geom_line(linewidth = 1) +
  geom_point(aes(shape = race), size = 2) +
  geom_label(
    data = highlight_race,
    aes(label = label, fill = race),  # <-- Changed from type to sex
    nudge_y = 0.5,
    color = "white",
    label.padding = unit(0.2, "lines"),
    label.size = 0.3,
    size = 3,
    show.legend = FALSE
  )+  labs(
    title = "Mean Time from Conviction to Exoneration by Race",
    x = "Years Since 1989", 
    y = "Time from Conviction to Exoneration (Years)"
  ) +
  theme_minimal(base_size = 11) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
        legend.position = "bottom") +
  scale_color_brewer(palette = "Dark2")
summary_age <- longitudinal_data_clean |>
  group_by(age_group, years_since_1989) |>
  summarize(mean_duration = mean(time_to_exoneration), .groups = "drop")

highlight_age <- summary_age |>
  group_by(age_group) |>
  filter(mean_duration == min(mean_duration) | mean_duration == max(mean_duration)) |>
  mutate(
    label = paste0("Year: ", years_since_1989, "\nMean: ", round(mean_duration, 2))
  ) 

ggplot(summary_age, aes(x = years_since_1989, y = mean_duration, group = age_group, color = age_group)) +
  geom_line(linewidth = 1) +
  geom_point(aes(shape = age_group), size = 2) +
 geom_label(
    data = highlight_age,
    aes(label = label, fill = age_group),  # <-- Changed from type to sex
    nudge_y = 0.5,
    color = "white",
    label.padding = unit(0.2, "lines"),
    label.size = 0.3,
    size = 3,
    show.legend = FALSE
  )+ 
  labs(
    title = "Mean Time from Conviction to Exoneration by Age Group",
    x = "Years Since 1989", 
    y = "Time from Conviction to Exoneration (Years)"
  ) + theme_minimal(base_size = 11) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
        legend.position = "bottom") +
  scale_color_brewer(palette = "Set1")
summary_jurisdiction <- longitudinal_data_clean |>
  group_by(jurisdiction, years_since_1989) |>
  summarize(mean_duration = mean(time_to_exoneration), .groups = "drop")

highlight_jurisdiction <- summary_jurisdiction |>
  group_by(jurisdiction) |>
  filter(mean_duration == min(mean_duration) | mean_duration == max(mean_duration)) |>
  mutate(
    label = paste0("Year: ", years_since_1989, "\nMean: ", round(mean_duration, 2))
  ) 

ggplot(summary_jurisdiction, aes(x = years_since_1989, y = mean_duration, group = jurisdiction, color = jurisdiction)) +
  geom_line(linewidth = 1) + 
  geom_point(aes(shape = jurisdiction), size = 2) +
  geom_label(
    data = highlight_jurisdiction,
    aes(label = label, fill = jurisdiction),  # <-- Changed from type to sex
    nudge_y = 0.5,
    color = "white",
    label.padding = unit(0.2, "lines"),
    label.size = 0.3,
    size = 3,
    show.legend = FALSE
  )+
  
   labs(
    title = "Mean Time from Conviction to Exoneration by Jurisdiction",
    x = "Years Since 1989", 
    y = "Time from Conviction to Exoneration (Years)"
  ) + 
  theme_minimal(base_size = 10) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
        legend.position = "bottom") +
  scale_color_brewer(palette = "Set2")
Figure 1: Mean time from conviction to exoneration per year.
Figure 2: Mean time from conviction to exoneration by sex over years since 1989.
Figure 3: Mean time from conviction to exoneration by crime type over years since 1989.
Figure 4: Mean time from conviction to exoneration by race over years since 1989.
Figure 5: Mean time from conviction to exoneration by age group over years since 1989.
Figure 6: Mean time from conviction to exoneration by Jurisdiction over years since 1989.

Discussion

In the United States, there has been a significant increase in the average duration from conviction to exoneration over the years. Since 1989, the average time has fluctuated, with the shortest average recorded at 4.66 years just three years after the baseline, while the longest reached an average of 20.41 years, occurring 35 years later.

When breaking down the data by sex, it was revealed that patterns varied. At the beginning, there was no average time to exoneration documented for females, which limited comparisons in the early years. However, over time, males had a lower average of 4.66 years three years post-baseline, while females showed a lower average of 2.21 years, observed 18 years after the baseline. The peak average for males was 21.24 years at the 35-year mark, while the peak for females was 14.82 years, recorded 33 years post-baseline.

Examining the data by jurisdiction, it was noted that federal cases often reported shorter average times compared to state cases, especially in the early years. Federal cases had a minimum average of just 0.76 years one year post-baseline, while state cases reached a minimum of 4.8 years three years after the baseline. However, federal cases also recorded a maximum average of 25.21 years at 31 years post-baseline, while state cases peaked at 21.31 years after 35 years. Overall, state cases generally exhibited higher average times throughout most of the study, although there were instances where federal cases surpassed them.

  1. Spaghetti Plots:
Code
ggplot(longitudinal_data_clean, 
       aes(x = years_since_1989, y = time_to_exoneration, group = corrected_state, colour = corrected_state)) +
  geom_line(alpha = 0.4, linewidth = 0.8) +
  labs(
    title = "Time from Conviction to Exoneration by State",
    x = "Years Since 1989", 
    y = "Time from Conviction to Exoneration (Years)"
  ) +
  theme_minimal(base_size = 11) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
    legend.position = "none"  # Hide overly busy legend
  ) +
  scale_color_viridis_d(option = "C", begin = 0.2, end = 0.8)
ggplot(longitudinal_data_clean, 
       aes(x = years_since_1989, y = time_to_exoneration, group = corrected_state, colour = corrected_state)) +
  facet_wrap(.~sex) +
  geom_line(alpha = 0.4, linewidth = 0.8) +
  labs(
    title = "Time from Conviction to Exoneration by Sex",
    x = "Years Since 1989", 
    y = "Time from Conviction to Exoneration (Years)"
  ) +
  theme_minimal(base_size = 11) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
        legend.position = "none") +
  scale_color_viridis_d(option = "B", begin = 0.2, end = 0.8)
ggplot(longitudinal_data_clean, 
       aes(x = years_since_1989, y = time_to_exoneration, group = corrected_state, color=corrected_state)) +
  facet_wrap(.~race) + geom_line(alpha = 0.4, linewidth = 0.8) +
  labs(
    title = "Time from Conviction to Exoneration by Race",
    x = "Years Since 1989", 
    y = "Time from Conviction to Exoneration (Years)"
  ) +
  theme_minimal(base_size = 11) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
        legend.position = "none") +
  scale_color_viridis_d(option = "C")
ggplot(longitudinal_data_clean, 
       aes(x = years_since_1989, y = time_to_exoneration, group = corrected_state, colour = corrected_state)) +
 facet_wrap(.~age_group) + geom_line(alpha = 0.4, linewidth = 0.8) +
  labs(
    title = "Time from Conviction to Exoneration by Age Group",
    x = "Years Since 1989", 
    y = "Time from Conviction to Exoneration (Years)"
  ) +
  theme_minimal(base_size = 11) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
        legend.position = "none") +
  scale_color_viridis_d(option = "D")
ggplot(longitudinal_data_clean, 
       aes(x = years_since_1989, y = time_to_exoneration, group = corrected_state, colour = corrected_state)) +
 facet_wrap(.~crime_type) + geom_line(alpha = 0.4, linewidth = 0.8) +
  labs(
    title = "Time from Conviction to Exoneration by Crime Type",
    x = "Years Since 1989", 
    y = "Time from Conviction to Exoneration (Years)"
  ) +
  theme_minimal(base_size = 11) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
        legend.position = "none") +
  scale_color_viridis_d(option = "E")
ggplot(longitudinal_data_clean,  
       aes(x = years_since_1989, y = time_to_exoneration, group = corrected_state, colour = corrected_state)) + 
 facet_wrap(.~jurisdiction) + geom_line(alpha = 0.4, linewidth = 0.8) +
  labs(
    title = "Time from Conviction to Exoneration by Jurisdiction",
    x = "Years Since 1989", 
    y = "Time from Conviction to Exoneration (Years)"
  ) +
  theme_minimal(base_size = 11) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
        legend.position = "none") +
  scale_color_viridis_d(option = "F")
Figure 7: Spaghetti Plot of Time from Conviction to Exoneration (All States)
Figure 8: Spaghetti Plot of Time from Conviction to Exoneration by Sex
Figure 9: Spaghetti Plot of Time from Conviction to Exoneration by Race
Figure 10: Spaghetti Plot of Time from Conviction to Exoneration by Age Group
Figure 11: Spaghetti Plot of Time from Conviction to Exoneration by Crime Type
Figure 12: Spaghetti Plot of Time from Conviction to Exoneration by Jurisdiction

Discussion

The spaghetti plot illustrates temporal trends in the duration from initial conviction to exoneration across various states in the United States. Each line, differentiated by color, represents a distinct state, thereby enabling assessments of state-level variations over time. In 1989, we identified notable disparities in the time from initial conviction to exoneration among states, indicating a progression in these differences.

  1. State-Specific Plots:
Code
ggplot(data = longitudinal_data_clean, 
       aes(x = years_since_1989, y = time_to_exoneration, group = corrected_state)) +
  facet_wrap(. ~ corrected_state, ncol = 6) + 
  geom_line(alpha = 0.6, linewidth = 0.8, color = "#2D708EFF") +
  geom_point(alpha = 0.6, color = "#2D708EFF", size = 0.8) +
  labs(
    title = "Time from Conviction to Exoneration by State",
    x = "Years Since 1989", 
    y = "Time to Exoneration (Years)"
  ) +
  theme_minimal(base_size = 11) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
    strip.text = element_text(size = 8),
    panel.spacing = unit(0.7, "lines")
  )
Figure 13: Time from Conviction to Exoneration by State

Discussion

The state-specific analysis revealed significant variability both between and within states regarding the time required for exoneration over the 35 years since 1989. States such as Illinois, Texas, New York, and California displayed consistent patterns of exonerations, accompanied by considerable variations in duration; many cases took over 20 years to resolve. Conversely, other states reported sparse data, with fewer exonerations and more variable patterns of exoneration. While certain states yielded sufficient observations to facilitate a clearer understanding of temporal trends, others contributed as few as three observations throughout the entire study period, which hindered our ability to examine within-state variation thoroughly. Overall, these findings highlighted the persistent and unequal impact of wrongful convictions in the United States.

3.2 Statistical Analyses

This section highlights the results of the linear mixed effects model. For comparison, the generalized estimating equation results are provided in the Appendix.

3.2.1 Sex as Covariate of Interest

Code
# Extract fixed effects summary
fixed_effects_df <- as.data.frame(summary(mod_sex2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")

# Get confidence intervals
ci <- nlme::intervals(mod_sex2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("CI Lower", "CI Upper")

# Combine results
fixed_effects_full <- cbind(fixed_effects_df, ci_df)


kable(fixed_effects_full, digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                font_size = 10,
                full_width = FALSE,
                position = "center")
Table 1: Fixed Effects - Sex Linear Mixed Model
Estimate Std. Error DF t-value p-value CI Lower CI Upper
(Intercept) 4.259 0.472 3396 9.023 0.000 3.334 5.184
years_since_1989 0.357 0.027 3396 13.183 0.000 0.304 0.410
sexFemale -0.196 1.409 3396 -0.139 0.889 -2.956 2.565
years_since_1989:sexFemale -0.187 0.060 3396 -3.129 0.002 -0.305 -0.070

Key Findings:

  • In 1989, the estimated average time from initial conviction to exoneration for males in the United States was 4.26 years. A significant main effect of time was observed, indicating that with each additional year since 1989, the estimated average time to exoneration for males increased by 0.36 years (95% CI: 0.30, 0.41; p < 0.001).

  • The main effect of sex was not statistically significant; females had an estimated average time to exoneration 0.20 years shorter than males in 1989, but this difference was not statistically significant (95% CI: -0.73, 0.32; p = 0.89). However, a significant interaction between sex and time indicated that the rate of change in the average exoneration time was 0.19 years slower per year for females compared to males (95% CI: -0.30, -0.07; p < 0.05).

3.2.2 Race as Covariate of Interest

Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_race2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")

ci <- nlme::intervals(mod_race2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")

fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]

kable(significant_effects, digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                font_size = 10,
                full_width = FALSE,
                position = "center")
Table 2: Fixed Effects - Race Linear Mixed Model (Significant Results Only)
Estimate Std. Error DF t-value p-value 95% CI Lower 95% CI Upper
(Intercept) 5.270 0.630 3388 8.365 0.000 4.037 6.503
years_since_1989 0.348 0.032 3388 10.888 0.000 0.286 0.411
raceHispanic -5.858 1.283 3388 -4.565 0.000 -8.369 -3.346
years_since_1989:raceHispanic 0.180 0.054 3388 3.358 0.001 0.075 0.285
years_since_1989:raceAsian -0.545 0.242 3388 -2.249 0.025 -1.020 -0.071

Key Findings (Significant Results Only):

  • In 1989, the estimated average time from initial conviction to exoneration for Black exonerees in the United States was 5.27 years. A significant main effect of time showed that this duration increased by 0.35 years for each additional year since 1989 (95% CI: 0.29, 0.41; p < 0.001).

  • A significant main effect of race indicated that Hispanic exonerees had a substantially shorter estimated average time to exoneration in 1989, 5.86 years less than that of Black exonerees (95% CI: -8.37, -3.35; p < 0.001).

  • Additionally, significant interaction effects between race and time were observed. Specifically, the estimated annual rate of change in the average exoneration time for Hispanic exonerees was 0.18 years greater than that for Black exonerees (95% CI: 0.08, 0.28; p < 0.05), whereas for Asian exonerees, the annual rate of change was 0.55 years less than that for Black exonerees (95% CI: -1.02, -0.07; p < 0.05).

3.2.3 Age Group as Covariate of Interest

Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_age_group2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")

ci <- nlme::intervals(mod_age_group2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")

fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]

kable(significant_effects, digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                font_size = 10,
                full_width = FALSE,
                position = "center")
Table 3: Fixed Effects - Age Group Linear Mixed Model (Significant Results Only)
Estimate Std. Error DF t-value p-value 95% CI Lower 95% CI Upper
(Intercept) 4.985 0.615 3390 8.106 0.000 3.781 6.189
years_since_1989 0.372 0.030 3390 12.325 0.000 0.313 0.431
years_since_1989:age_groupAdolescence (15–19) 0.148 0.046 3390 3.213 0.001 0.058 0.238
years_since_1989:age_groupMid Adulthood (30–39) -0.086 0.043 3390 -2.005 0.045 -0.169 -0.002
years_since_1989:age_groupOlder Adulthood (40+) -0.237 0.048 3390 -4.961 0.000 -0.330 -0.143

Key Findings (Significant Results Only):

  • In 1989, the estimated average time from initial conviction to exoneration for the 0–14 age group in the United States was 4.98 years. A significant main effect of time indicated that this duration increased by 0.37 years for each additional year since 1989 (95% CI: 0.31, 0.43; p < 0.001).

  • However, the main effect of age group was not statistically significant, as there was insufficient evidence to conclude that the average time to exoneration in 1989 differed across age groups (ANOVA p = 0.33).

  • Significant interaction effects between age group and time were observed. Specifically:

    • The annual rate of change in average exoneration time for the 15–19 age group was 0.15 years greater than that for the 0–14 age group (95% CI: 0.06, 0.24; p < 0.05),

    • The 30–39 age group showed a slightly slower rate of change, at 0.09 years less per year (95% CI: -0.17, -0.00; p = 0.045).

    • The 40+ age group experienced the slowest increase, with an annual rate of change 0.24 years less than that for the 0–14 age group (95% CI: -0.33, -0.14; p < 0.001).

3.2.4 Crime Type as Covariate of Interest

Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_crime_type2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")

ci <- nlme::intervals(mod_crime_type2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")

fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]

kable(significant_effects, digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                font_size = 10,
                full_width = FALSE,
                position = "center")
Table 4: Fixed Effects - Crime Type Linear Mixed Model (Significant Results Only)
Estimate Std. Error DF t-value p-value 95% CI Lower 95% CI Upper
(Intercept) 4.452 0.431 3388 10.340 0.000 3.609 5.294
years_since_1989 0.404 0.026 3388 15.682 0.000 0.353 0.454
crime_typeSociety Crimes -6.044 1.258 3388 -4.802 0.000 -8.507 -3.580
years_since_1989:crime_typeProperty Crimes -0.209 0.094 3388 -2.221 0.026 -0.393 -0.025
years_since_1989:crime_typeWhite-collar Crimes -0.310 0.116 3388 -2.683 0.007 -0.537 -0.084
years_since_1989:crime_typeSociety Crimes -0.165 0.050 3388 -3.308 0.001 -0.262 -0.067
years_since_1989:crime_typeJustice System Crimes -0.395 0.198 3388 -1.991 0.047 -0.782 -0.007

Key Findings:

  • In 1989, the estimated average time from initial conviction to exoneration for crimes against people in the United States was 4.45 years. A significant main effect of time indicated that this duration increased by 0.40 years for each additional year since 1989 (95% CI: 0.35, 0.45; p < 0.001).

  • A significant main effect of crime type was observed. Specifically, in 1989, individuals convicted of society crimes had an estimated average exoneration time that was 6.04 years shorter than those convicted of crimes against people (95% CI: -8.51, -3.58; p < 0.001).

  • Additionally, significant interaction effects between crime type and time were identified. The annual rate of change in the average exoneration time for property crimes was 0.21 years less per year than for crimes against people (95% CI: -0.39, -0.03; p = 0.026), while white-collar crimes showed a rate 0.31 years less per year (95% CI: -0.54, -0.08; p = 0.007). Society crimes had an annual rate of change in the average exoneration time 0.17 years less per year than crimes against people (95% CI: -0.26, -0.07; p = 0.001), and justice system crimes showed the largest difference, with a rate 0.40 years less per year (95% CI: -0.78, -0.01; p = 0.047).

3.2.5 Jurisdiction Type as Covariate of Interest

Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_jurisdiction_type2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")

ci <- nlme::intervals(mod_jurisdiction_type2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")

fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]

kable(significant_effects, digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                font_size = 10,
                full_width = FALSE,
                position = "center")
Table 5: Fixed Effects - Jurisdiction Linear Mixed Model (Significant Results Only)
Estimate Std. Error DF t-value p-value 95% CI Lower 95% CI Upper
(Intercept) 4.433 0.487 3396 9.110 0.000 3.480 5.387
years_since_1989 0.347 0.030 3396 11.634 0.000 0.288 0.405
years_since_1989:jurisdictionFederal -0.223 0.091 3396 -2.444 0.015 -0.402 -0.044

Key Findings:

  • In 1989, the estimated average time from initial conviction to exoneration for state-level cases in the United States was 4.43 years. A significant main effect of time indicated that this duration increased by 0.35 years for each additional year since 1989 (95% CI: 0.29, 0.41; p < 0.05).

  • The main effect of jurisdiction was not statistically significant; there was insufficient evidence to conclude that the average exoneration time in 1989 differed between state and federal cases (ANOVA p = 0.18). However, a significant interaction between jurisdiction and time revealed that the annual rate of change in the average time to exoneration for state-level cases was 0.22 years less per year compared to federal cases (95% CI: -0.40, -0.04; p < 0.05).

3.2.6 Crime Type with Demographic Controls

Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_crime_type_extended2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")

ci <- nlme::intervals(mod_crime_type_extended2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")

fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]

kable(significant_effects, digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                font_size = 10,
                full_width = FALSE,
                position = "center")
Table 6: Fixed Effects Estimates for Crime Type with Demographic Controls (Significant Results Only)
Estimate Std. Error DF t-value p-value 95% CI Lower 95% CI Upper
(Intercept) 9.947 0.597 3381 16.655 0.000 8.779 11.115
years_since_1989 0.393 0.024 3381 16.704 0.000 0.347 0.439
crime_typeSociety Crimes -5.056 1.240 3381 -4.078 0.000 -7.480 -2.632
age -0.150 0.015 3381 -10.181 0.000 -0.179 -0.121
raceWhite -1.113 0.343 3381 -3.247 0.001 -1.783 -0.443
raceHispanic -2.722 0.453 3381 -6.011 0.000 -3.607 -1.836
raceAsian -4.613 1.495 3381 -3.086 0.002 -7.536 -1.691
sexFemale -2.424 0.499 3381 -4.858 0.000 -3.400 -1.448
years_since_1989:crime_typeProperty Crimes -0.188 0.092 3381 -2.057 0.040 -0.368 -0.009
years_since_1989:crime_typeWhite-collar Crimes -0.232 0.113 3381 -2.055 0.040 -0.453 -0.011
years_since_1989:crime_typeSociety Crimes -0.178 0.049 3381 -3.633 0.000 -0.274 -0.082

Key Findings:

Significant interaction effects between crime type and time were observed. After adjusting for age at baseline, race, and sex, the estimated annual rate of change in the average time from initial conviction to exoneration for exonerees convicted of property crimes was 0.19 years less per year than for those convicted of crimes against people (95% CI: -0.368, -0.009; p = 0.040). Similarly, for white-collar crimes, the annual rate of change in the average time was 0.23 years less per year compared to crimes against people (95% CI: -0.453, -0.011; p = 0.040). Exonerees convicted of society crimes also experienced a slower increase in average exoneration time, with a rate 0.18 years less per year than that for crimes against people (95% CI: -0.274, -0.082; p < 0.001).

4 Discussion

The United States often identifies itself as the “Land of the Free,” yet since 1989, there have been over 3,000 exonerations in the country. Innocent individuals have been wrongfully convicted of crimes of varying severity. This alarming statistic reflects a significant loss of years, leading to profound emotional, physical, and social instability for many. By utilizing data from 3,450 exonerees documented in the National Registry of Exonerations, this project aimed to analyze how the duration between initial conviction and eventual exoneration has evolved in the United States, alongside the influence of various factors such as demographics, crime types, and case characteristics. The demographic factors considered included the age of the exonerees at the time of conviction, as well as their sex and race. Case characteristics examined consisted of the type of crime and the jurisdiction involved. By analyzing factors such as race, age, sex, crime type, and jurisdiction, we identified patterns that may influence the duration it takes wrongfully convicted individuals to achieve exoneration.

The cross-sectional exploratory analysis of the data revealed significant differences in the characteristics of exonerees. Specifically, individuals spent an average of 12.3 years from conviction to exoneration, with a mean age of 28.3 years at the time of conviction. Males accounted for over 90% of exonerations, particularly in cases involving crimes against people (93%) and justice system crimes (94%). The age group of 20-29 years old represented over 40% of cases, while Black individuals constituted 53% of exonerees, especially in society crimes (69%) and crimes against people (52%). Most exonerations occurred at the state level, with crimes against people representing over 72% of the total cases (2,508 in total). The time required for exoneration varied by crime type, averaging 14.34 years for crimes against people and 4.10 years for justice system crimes. White-collar crimes had a higher proportion of white defendants (75%) and were predominantly federal cases (69%).

Due to the longitudinal nature of the data, a more sophisticated analysis was required. We utilized various visualization techniques, including spaghetti plots and subject-specific charts, to explore the within- and between-state variability in the time to exoneration over the 35-year period since 1989. The data exhibited imbalanced and complex structures: some states provided numerous observations with clear temporal trends, while others offered as few as three observations throughout the entire study period. Furthermore, the overall mean plot of time to exoneration indicated an increasing trend over time, accompanied by fluctuations, while stratified plots based on demographic and case characteristics revealed distinct associations.

4.1 Key Findings

The longitudinal modelling of exoneration cases from 1989 onwards revealed significant trends and disparities in the time from initial conviction to exoneration in the United States. Over the past three decades, exoneration times have increased substantially, with an average annual rise of approximately 0.35 to 0.40 years across most demographic groups. Notably, Hispanic exonerees experienced significantly shorter initial exoneration times compared to Black exonerees. Additionally, the rate of increase in exoneration times varied by sex (slower for females), age group (slower for older individuals), crime type (slower increases for property crimes, white-collar crimes, and justice system offenses compared to crimes against people), and jurisdiction (slower increases for state versus federal cases). These trends suggest that while overall exoneration times are lengthening, the burden of these delays is not equally distributed across demographic groups, highlighting systemic disparities within the criminal justice system.

4.2 Methodological Differences

The analysis employed both Linear Mixed Models (LMM) and Generalized Estimating Equations (GEE), yielding some consistent and inconsistent findings. LMM provides interpretations that account for individual state-level variations, while GEE estimates effects across the entire population without focusing on state-by-state differences. These methodological distinctions mean that effect sizes and significance levels may differ between approaches, particularly when examining interaction effects. It is crucial to interpret the findings within the context of the specific modeling framework used.

4.3 Limitations

Several critical limitations affected the interpretation of the findings regarding wrongful convictions:

  1. Selection Bias: The analysis is based on documented exonerations, likely overlooking many undocumented cases due to factors like insufficient resources and high evidentiary standards.

  2. Uneven Sample Sizes: The varying sizes across demographic categories can lead to overestimation of effect sizes and impact the reliability of results, particularly for underrepresented groups.

  3. Neglected Factors: Important influences on exoneration duration, such as false confessions and the advancements in DNA testing, were not accounted for in the analysis.

Overall, while the findings highlight trends in the exoneration process, recognizing these limitations is essential for guiding future research and advocacy on wrongful convictions.

Note

Grammarly contributed to this text by responding to these AI prompts:

Prompts I wrote:

  • “make more academic”
  • “Improve it”
  • “Summarize it”

5 Appendix: Statistical Code

5.1 Model Setup and Comparison Functions

5.2 Sex Models

Code
# Linear Mixed Effects Models
mod_sex1 <- lme(time_to_exoneration ~ years_since_1989 * sex,
                data = longitudinal_data_clean, method = "ML",
                random = reStruct(~1 | corrected_state, pdClass = "pdDiag", REML = FALSE))

mod_sex2 <- lme(time_to_exoneration ~ years_since_1989 * sex,
                data = longitudinal_data_clean, method = "ML",
                random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdDiag", REML = FALSE))

mod_sex3 <- lme(time_to_exoneration ~ years_since_1989 * sex,
                data = longitudinal_data_clean, method = "ML",
                random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdSymm", REML = FALSE))

# GEE Model
sex_mod_glm <- glmgee(time_to_exoneration ~ years_since_1989 * sex, 
                      data = longitudinal_data_clean, 
                      id = corrected_state, 
                      corstr = "Exchangeable")

5.3 Sex Results Tables

Code
# Extract fixed effects summary
fixed_effects_df <- as.data.frame(summary(mod_sex2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")

# Get confidence intervals
ci <- nlme::intervals(mod_sex2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("CI Lower", "CI Upper")

# Combine results
fixed_effects_full <- cbind(fixed_effects_df, ci_df)

kable(fixed_effects_full, digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                font_size = 10,
                full_width = FALSE,
                position = "center")
Estimate Std. Error DF t-value p-value CI Lower CI Upper
(Intercept) 4.259 0.472 3396 9.023 0.000 3.334 5.184
years_since_1989 0.357 0.027 3396 13.183 0.000 0.304 0.410
sexFemale -0.196 1.409 3396 -0.139 0.889 -2.956 2.565
years_since_1989:sexFemale -0.187 0.060 3396 -3.129 0.002 -0.305 -0.070
Code
tab_model(sex_mod_glm, title = "GEE Model - Sex as Predictor")
GEE Model - Sex as Predictor
  time to exoneration
Predictors Estimates CI p
(Intercept) 3.84 2.45 – 5.23 <0.001
years since 1989 0.39 0.32 – 0.46 <0.001
sex [Female] 0.52 -2.09 – 3.13 0.696
years since 1989 × sex
[Female]
-0.22 -0.35 – -0.09 0.001
N corrected_state 51
Observations 3450

5.4 Race Models

Code
# Linear Mixed Effects Models
mod_race1 <- lme(time_to_exoneration ~ years_since_1989 * race,
                 data = longitudinal_data_clean, method = "ML",
                 random = reStruct(~1 | corrected_state, pdClass = "pdDiag", REML = FALSE))

mod_race2 <- lme(time_to_exoneration ~ years_since_1989 * race,
                 data = longitudinal_data_clean, method = "ML",
                 random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdDiag", REML = FALSE))

mod_race3 <- lme(time_to_exoneration ~ years_since_1989 * race,
                 data = longitudinal_data_clean, method = "ML",
                 random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdSymm", REML = FALSE))

# GEE Model
race_mod_glm <- glmgee(time_to_exoneration ~ years_since_1989 * race, 
                       data = longitudinal_data_clean, 
                       id = corrected_state, 
                       corstr = "Exchangeable")

5.5 Race Results Tables

Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_race2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")

ci <- nlme::intervals(mod_race2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")

fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]

kable(significant_effects, digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                font_size = 10,
                full_width = FALSE,
                position = "center")
Estimate Std. Error DF t-value p-value 95% CI Lower 95% CI Upper
(Intercept) 5.270 0.630 3388 8.365 0.000 4.037 6.503
years_since_1989 0.348 0.032 3388 10.888 0.000 0.286 0.411
raceHispanic -5.858 1.283 3388 -4.565 0.000 -8.369 -3.346
years_since_1989:raceHispanic 0.180 0.054 3388 3.358 0.001 0.075 0.285
years_since_1989:raceAsian -0.545 0.242 3388 -2.249 0.025 -1.020 -0.071
Code
tab_model(race_mod_glm, title = "GEE Model - Race as Predictor")
GEE Model - Race as Predictor
  time to exoneration
Predictors Estimates CI p
(Intercept) 4.86 3.08 – 6.63 <0.001
years since 1989 0.37 0.27 – 0.48 <0.001
race [White] -0.09 -1.90 – 1.73 0.927
race [Hispanic] -5.44 -10.43 – -0.44 0.033
race [Asian] 5.29 0.60 – 9.98 0.027
race [Native American] 10.10 0.61 – 19.60 0.037
race [Other] -3.86 -8.74 – 1.03 0.122
years since 1989 × race
[White]
-0.09 -0.21 – 0.02 0.120
years since 1989 × race
[Hispanic]
0.16 -0.12 – 0.43 0.259
years since 1989 × race
[Asian]
-0.52 -0.72 – -0.32 <0.001
years since 1989 × race
[Native American]
-0.38 -0.86 – 0.11 0.125
years since 1989 × race
[Other]
-0.04 -0.33 – 0.25 0.793
N corrected_state 51
Observations 3450

5.6 Age Group Models

Code
# Linear Mixed Effects Models
mod_age_group1 <- lme(time_to_exoneration ~ years_since_1989 * age_group,
                      data = longitudinal_data_clean, method = "ML",
                      random = reStruct(~1 | corrected_state, pdClass = "pdDiag", REML = FALSE))

mod_age_group2 <- lme(time_to_exoneration ~ years_since_1989 * age_group,
                      data = longitudinal_data_clean, method = "ML",
                      random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdDiag", REML = FALSE))

mod_age_group3 <- lme(time_to_exoneration ~ years_since_1989 * age_group,
                      data = longitudinal_data_clean, method = "ML",
                      random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdSymm", REML = FALSE))

# GEE Model
age_group_mod_glm <- glmgee(time_to_exoneration ~ years_since_1989 * age_group, 
                            data = longitudinal_data_clean, 
                            id = corrected_state, 
                            corstr = "Exchangeable")

5.7 Age Group Results Tables

Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_age_group2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")

ci <- nlme::intervals(mod_age_group2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")

fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]

kable(significant_effects, digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                font_size = 10,
                full_width = FALSE,
                position = "center")
Estimate Std. Error DF t-value p-value 95% CI Lower 95% CI Upper
(Intercept) 4.985 0.615 3390 8.106 0.000 3.781 6.189
years_since_1989 0.372 0.030 3390 12.325 0.000 0.313 0.431
years_since_1989:age_groupAdolescence (15–19) 0.148 0.046 3390 3.213 0.001 0.058 0.238
years_since_1989:age_groupMid Adulthood (30–39) -0.086 0.043 3390 -2.005 0.045 -0.169 -0.002
years_since_1989:age_groupOlder Adulthood (40+) -0.237 0.048 3390 -4.961 0.000 -0.330 -0.143
Code
tab_model(age_group_mod_glm, title = "GEE Model - Age Group as Predictor")
GEE Model - Age Group as Predictor
  time to exoneration
Predictors Estimates CI p
(Intercept) 4.78 3.28 – 6.28 <0.001
years since 1989 0.39 0.30 – 0.47 <0.001
age group [Childhood
(0–14)]
3.56 -10.31 – 17.43 0.615
age group [Adolescence
(15–19)]
-2.32 -5.22 – 0.58 0.117
age group [Mid Adulthood
(30–39)]
-0.49 -1.99 – 1.01 0.523
age group [Older
Adulthood (40+)]
-0.88 -3.08 – 1.33 0.437
years since 1989 × age
group [Childhood (0–14)]
-0.14 -0.85 – 0.57 0.704
years since 1989 × age
group [Adolescence
(15–19)]
0.16 0.05 – 0.28 0.005
years since 1989 × age
group [Mid Adulthood
(30–39)]
-0.09 -0.16 – -0.01 0.031
years since 1989 × age
group [Older Adulthood
(40+)]
-0.25 -0.40 – -0.10 0.001
N corrected_state 51
Observations 3450

5.8 Crime Type Models

Code
# Linear Mixed Effects Models
mod_crime_type1 <- lme(time_to_exoneration ~ years_since_1989 * crime_type,
                       data = longitudinal_data_clean, method = "ML",
                       random = reStruct(~1 | corrected_state, pdClass = "pdDiag", REML = FALSE))

mod_crime_type2 <- lme(time_to_exoneration ~ years_since_1989 * crime_type,
                       data = longitudinal_data_clean, method = "ML",
                       random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdDiag", REML = FALSE))

mod_crime_type3 <- lme(time_to_exoneration ~ years_since_1989 * crime_type,
                       data = longitudinal_data_clean, method = "ML",
                       random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdSymm", REML = FALSE))

# GEE Model
crime_type_mod_glm <- glmgee(time_to_exoneration ~ years_since_1989 * crime_type, 
                             data = longitudinal_data_clean, 
                             id = corrected_state, 
                             corstr = "Exchangeable")

5.9 Crime Type Results Tables

Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_crime_type2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")

ci <- nlme::intervals(mod_crime_type2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")

fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]

kable(significant_effects, digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                font_size = 10,
                full_width = FALSE,
                position = "center")
Estimate Std. Error DF t-value p-value 95% CI Lower 95% CI Upper
(Intercept) 4.452 0.431 3388 10.340 0.000 3.609 5.294
years_since_1989 0.404 0.026 3388 15.682 0.000 0.353 0.454
crime_typeSociety Crimes -6.044 1.258 3388 -4.802 0.000 -8.507 -3.580
years_since_1989:crime_typeProperty Crimes -0.209 0.094 3388 -2.221 0.026 -0.393 -0.025
years_since_1989:crime_typeWhite-collar Crimes -0.310 0.116 3388 -2.683 0.007 -0.537 -0.084
years_since_1989:crime_typeSociety Crimes -0.165 0.050 3388 -3.308 0.001 -0.262 -0.067
years_since_1989:crime_typeJustice System Crimes -0.395 0.198 3388 -1.991 0.047 -0.782 -0.007
Code
tab_model(crime_type_mod_glm, title = "GEE Model - Crime Type as Predictor")
GEE Model - Crime Type as Predictor
  time to exoneration
Predictors Estimates CI p
(Intercept) 3.19 2.20 – 4.18 <0.001
years since 1989 0.47 0.42 – 0.51 <0.001
crime type [Property
Crimes]
-3.70 -6.25 – -1.15 0.004
crime type [White-collar
Crimes]
-3.04 -5.83 – -0.26 0.032
crime type [Society
Crimes]
-6.64 -11.34 – -1.94 0.006
crime type [Justice
System Crimes]
-1.47 -5.22 – 2.28 0.442
crime type [Other Crimes] -2.60 -8.01 – 2.80 0.345
years since 1989 × crime
type [Property Crimes]
-0.20 -0.36 – -0.04 0.013
years since 1989 × crime
type [White-collar
Crimes]
-0.31 -0.51 – -0.11 0.002
years since 1989 × crime
type [Society Crimes]
-0.13 -0.41 – 0.15 0.358
years since 1989 × crime
type [Justice System
Crimes]
-0.41 -0.56 – -0.26 <0.001
years since 1989 × crime
type [Other Crimes]
-0.33 -0.57 – -0.09 0.007
N corrected_state 51
Observations 3450

5.10 Jurisdiction Models

Code
# Linear Mixed Effects Models
mod_jurisdiction_type1 <- lme(time_to_exoneration ~ years_since_1989 * jurisdiction,
                              data = longitudinal_data_clean, method = "ML",
                              random = reStruct(~1 | corrected_state, pdClass = "pdDiag", REML = FALSE))

mod_jurisdiction_type2 <- lme(time_to_exoneration ~ years_since_1989 * jurisdiction,
                              data = longitudinal_data_clean, method = "ML",
                              random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdDiag", REML = FALSE))

mod_jurisdiction_type3 <- lme(time_to_exoneration ~ years_since_1989 * jurisdiction,
                              data = longitudinal_data_clean, method = "ML",
                              random = reStruct(~1 + years_since_1989| corrected_state, pdClass = "pdSymm", REML = FALSE))

# GEE Model
jurisdiction_mod_glm <- glmgee(time_to_exoneration ~ years_since_1989 * jurisdiction, 
                               data = longitudinal_data_clean, 
                               id = corrected_state, 
                               corstr = "Exchangeable")

5.11 Jurisdiction Results Tables

Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_jurisdiction_type2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")

ci <- nlme::intervals(mod_jurisdiction_type2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")

fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]

kable(significant_effects, digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                font_size = 10,
                full_width = FALSE,
                position = "center")
Estimate Std. Error DF t-value p-value 95% CI Lower 95% CI Upper
(Intercept) 4.433 0.487 3396 9.110 0.000 3.480 5.387
years_since_1989 0.347 0.030 3396 11.634 0.000 0.288 0.405
years_since_1989:jurisdictionFederal -0.223 0.091 3396 -2.444 0.015 -0.402 -0.044
Code
tab_model(jurisdiction_mod_glm, title = "GEE Model - Jurisdiction as Predictor")
GEE Model - Jurisdiction as Predictor
  time to exoneration
Predictors Estimates CI p
(Intercept) 4.12 2.65 – 5.60 <0.001
years since 1989 0.37 0.30 – 0.45 <0.001
jurisdiction [Federal] -3.63 -6.88 – -0.38 0.028
years since 1989 ×
jurisdiction [Federal]
-0.15 -0.39 – 0.09 0.224
N corrected_state 51
Observations 3450

5.12 Crime Type with Demographic Controls

Code
# Linear Mixed Effects Models with controls
mod_crime_type_extended1 <- lme(time_to_exoneration ~ years_since_1989 * crime_type + age + race + sex,
                                data = longitudinal_data_clean, method = "ML",
                                random = reStruct(~1 | corrected_state, pdClass = "pdDiag", REML = FALSE))

mod_crime_type_extended2 <- lme(time_to_exoneration ~ years_since_1989 * crime_type + age + race + sex,
                                data = longitudinal_data_clean, method = "ML",
                                random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdDiag", REML = FALSE))

mod_crime_type_extended3 <- lme(time_to_exoneration ~ years_since_1989 * crime_type + age + race + sex,
                                data = longitudinal_data_clean, method = "ML",
                                random = reStruct(~1 + years_since_1989| corrected_state, pdClass = "pdSymm", REML = FALSE))

# GEE Model with controls
crime_type_extended_glm <- glmgee(time_to_exoneration ~ years_since_1989 * crime_type + age + race + sex, 
                                  data = longitudinal_data_clean, 
                                  id = corrected_state, 
                                  corstr = "Exchangeable")

5.13 Crime Type Extended Results Tables

Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_crime_type_extended2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")

ci <- nlme::intervals(mod_crime_type_extended2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")

fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]

kable(significant_effects, digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                font_size = 10,
                full_width = FALSE,
                position = "center")
Estimate Std. Error DF t-value p-value 95% CI Lower 95% CI Upper
(Intercept) 9.947 0.597 3381 16.655 0.000 8.779 11.115
years_since_1989 0.393 0.024 3381 16.704 0.000 0.347 0.439
crime_typeSociety Crimes -5.056 1.240 3381 -4.078 0.000 -7.480 -2.632
age -0.150 0.015 3381 -10.181 0.000 -0.179 -0.121
raceWhite -1.113 0.343 3381 -3.247 0.001 -1.783 -0.443
raceHispanic -2.722 0.453 3381 -6.011 0.000 -3.607 -1.836
raceAsian -4.613 1.495 3381 -3.086 0.002 -7.536 -1.691
sexFemale -2.424 0.499 3381 -4.858 0.000 -3.400 -1.448
years_since_1989:crime_typeProperty Crimes -0.188 0.092 3381 -2.057 0.040 -0.368 -0.009
years_since_1989:crime_typeWhite-collar Crimes -0.232 0.113 3381 -2.055 0.040 -0.453 -0.011
years_since_1989:crime_typeSociety Crimes -0.178 0.049 3381 -3.633 0.000 -0.274 -0.082
Code
tab_model(crime_type_extended_glm, title = "GEE Model - Crime Type with Controls")
GEE Model - Crime Type with Controls
  time to exoneration
Predictors Estimates CI p
(Intercept) 9.07 7.33 – 10.82 <0.001
years since 1989 0.44 0.40 – 0.48 <0.001
crime type [Property
Crimes]
-2.50 -5.77 – 0.77 0.134
crime type [White-collar
Crimes]
-1.35 -4.49 – 1.79 0.398
crime type [Society
Crimes]
-5.76 -10.54 – -0.98 0.018
crime type [Justice
System Crimes]
-0.06 -5.13 – 5.00 0.980
crime type [Other Crimes] -1.61 -6.60 – 3.38 0.527
age -0.15 -0.21 – -0.09 <0.001
race [White] -1.15 -2.00 – -0.29 0.008
race [Hispanic] -2.72 -4.27 – -1.16 0.001
race [Asian] -4.63 -7.09 – -2.16 <0.001
race [Native American] 0.38 -2.96 – 3.72 0.823
race [Other] -1.67 -4.30 – 0.96 0.213
sex [Female] -2.43 -3.24 – -1.61 <0.001
years since 1989 × crime
type [Property Crimes]
-0.18 -0.38 – 0.01 0.069
years since 1989 × crime
type [White-collar
Crimes]
-0.24 -0.43 – -0.04 0.016
years since 1989 × crime
type [Society Crimes]
-0.14 -0.40 – 0.12 0.281
years since 1989 × crime
type [Justice System
Crimes]
-0.36 -0.56 – -0.15 0.001
years since 1989 × crime
type [Other Crimes]
-0.28 -0.49 – -0.08 0.006
N corrected_state 51
Observations 3450

5.14 Model Comparison Tables

Code
kable(compare_sex, caption = "Model Comparison for Sex", digits = 3) %>% 
  kable_styling(bootstrap_options = c("striped", "hover"), font_size = 8)
Model Comparison for Sex
CIC.Object CIC.Correlation CIC.CIC QIC GHYC RJC AGPC SGPC
Independence m_indep Independence 21.613 3489.226 109768.4 84.800 Inf Inf
Exchangeable m_exch Exchangeable 14.212 3474.423 110649.3 4.355 Inf Inf
AR(1) m_ar1 AR-M-dependent(1) 21.685 3489.370 107943.5 45.555 Inf Inf
AR(2) m_ar2 AR-M-dependent(2) 21.569 3489.138 106931.0 25.446 Inf Inf
AR(3) m_ar3 AR-M-dependent(3) 21.298 3488.596 105943.8 17.714 Inf Inf
Code
kable(compare_race, caption = "Model Comparison for Race", digits = 3) %>% 
  kable_styling(bootstrap_options = c("striped", "hover"), font_size = 8)
Model Comparison for Race
CIC.Object CIC.Correlation CIC.CIC QIC GHYC RJC AGPC SGPC
Independence m_indep Independence 42.814 3523.627 112962.1 55.583 Inf Inf
Exchangeable m_exch Exchangeable 34.660 3507.321 111271.7 15.681 Inf Inf
AR(1) m_ar1 AR-M-dependent(1) 40.896 3519.792 109605.1 35.106 Inf Inf
AR(2) m_ar2 AR-M-dependent(2) 38.887 3515.774 107192.0 22.033 Inf Inf
AR(3) m_ar3 AR-M-dependent(3) 38.731 3515.462 105896.7 18.667 Inf Inf
Code
kable(compare_age_group, caption = "Model Comparison for Age Group", digits = 3) %>% 
  kable_styling(bootstrap_options = c("striped", "hover"), font_size = 8)
Model Comparison for Age Group
CIC.Object CIC.Correlation CIC.CIC QIC GHYC RJC AGPC SGPC
Independence m_indep Independence 34.852 3509.704 106912.2 45.185 Inf Inf
Exchangeable m_exch Exchangeable 27.830 3495.660 107946.9 11.371 Inf Inf
AR(1) m_ar1 AR-M-dependent(1) 34.765 3509.530 105070.5 30.628 Inf Inf
AR(2) m_ar2 AR-M-dependent(2) 34.635 3509.270 103519.8 21.663 Inf Inf
AR(3) m_ar3 AR-M-dependent(3) 34.698 3509.395 102843.7 18.645 Inf Inf
Code
kable(compare_crime_type, caption = "Model Comparison for Crime Type", digits = 3) %>% 
  kable_styling(bootstrap_options = c("striped", "hover"), font_size = 8)
Model Comparison for Crime Type
CIC.Object CIC.Correlation CIC.CIC QIC GHYC RJC AGPC SGPC
Independence m_indep Independence 54.920 3547.840 102634.43 154.970 Inf Inf
Exchangeable m_exch Exchangeable 47.972 3533.948 116496.69 55.650 Inf Inf
AR(1) m_ar1 AR-M-dependent(1) 53.842 3545.684 102273.54 112.370 Inf Inf
AR(2) m_ar2 AR-M-dependent(2) 49.747 3537.494 100264.85 68.746 Inf Inf
AR(3) m_ar3 AR-M-dependent(3) 49.069 3536.137 99260.09 58.862 Inf Inf
Code
kable(compare_jurisdiction, caption = "Model Comparison for Jurisdiction", digits = 3) %>% 
  kable_styling(bootstrap_options = c("striped", "hover"), font_size = 8)
Model Comparison for Jurisdiction
CIC.Object CIC.Correlation CIC.CIC QIC GHYC RJC AGPC SGPC
Independence m_indep Independence 34.415 3514.830 110907.9 162.402 Inf Inf
Exchangeable m_exch Exchangeable 19.914 3485.827 112274.3 9.517 Inf Inf
AR(1) m_ar1 AR-M-dependent(1) 31.405 3508.810 108074.3 78.460 Inf Inf
AR(2) m_ar2 AR-M-dependent(2) 29.710 3505.419 107018.0 38.916 Inf Inf
AR(3) m_ar3 AR-M-dependent(3) 28.648 3503.295 106027.2 26.197 Inf Inf

References

Aldis, M. (2023). Exonerated texas woman pleads for help to get bullet out of her arm. FOX 7 Austin. https://www.fox7austin.com/news/texas-exonerated-woman-lacresha-murray
Constitution Annotated. (n.d.). U.s. Constitution - sixth amendment | resources | constitution annotated | congress.gov | library of congress. Congress.gov. https://constitution.congress.gov/constitution/amendment-6/
Fitzmaurice, G. M., Laird, N. M., & Ware, J. H. (2011). Applied longitudinal analysis. Wiley.
Ikpea, O. W. (2024). Wrongfully convicted: Uncovering the stories behind u.s. exonerations. Quarto.pub. https://obehiikpea.quarto.pub/wrongfully-convicted-uncovering-the-stories-behind-us-exonerations/
Innocence Project. (2023). Innocence project: Race and wrongful conviction. https://innocenceproject.org/race-and-wrongful-conviction/.
Lahera, N. (2023). The ultimate injustice: States’ failure to take steps to prevent wrongful convictions and, when wrongful convictions are exposed, to provide adequate assistance to exonerees. FIU Law Review, 17(3), 703–737. https://doi.org/10.25148/lawrev.17.3.13
National Association of Criminal Defense Lawyers. (2022). Prosecution of senator ted stevens. NACDL. https://www.nacdl.org/Content/ProsecutionofSenatorTedStevens
National Registry of Exonerations. (2022). Home | national registry of exonerations. University of California Irvine, University of Michigan Law School,; Michigan State University College of Law. https://exonerationregistry.org
Vanegas, L. H., Rondon, L. M., & Paula, G. A. (2023). Generalized estimating equations using the new r package glmtoolbox. The R Journal, 15(2), 105–133. https://doi.org/10.32614/rj-2023-056